From fd5b593b0ad5eba1f0f8ee22b030c26951c3f777 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild2.aw" Date: Wed, 28 Feb 2007 10:18:44 -0700 Subject: [PATCH] [IA64] Fix ptc.ga emulation bug If a vcpu migrates to the local cpu, smp_call_function_single() doesn't work. Call ptc_ga_remote_func() directly instead. Signed-off-by: Anthony Xu --- xen/arch/ia64/vmx/vmmu.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/xen/arch/ia64/vmx/vmmu.c b/xen/arch/ia64/vmx/vmmu.c index 901c07bed4..6a4ac502c2 100644 --- a/xen/arch/ia64/vmx/vmmu.c +++ b/xen/arch/ia64/vmx/vmmu.c @@ -590,6 +590,7 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u64 va, u64 ps) struct domain *d = vcpu->domain; struct vcpu *v; struct ptc_ga_args args; + int proc; args.vadr = va; vcpu_get_rr(vcpu, va, &args.rid); @@ -599,20 +600,21 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u64 va, u64 ps) continue; args.vcpu = v; - if (v->processor != vcpu->processor) { - int proc; +again: /* Try again if VCPU has migrated. */ + proc = v->processor; + if (proc != vcpu->processor) { /* Flush VHPT on remote processors. */ - do { - proc = v->processor; - smp_call_function_single(v->processor, - &ptc_ga_remote_func, &args, 0, 1); - /* Try again if VCPU has migrated. */ - } while (proc != v->processor); - } - else if(v == vcpu) + smp_call_function_single(v->processor, + &ptc_ga_remote_func, &args, 0, 1); + if (proc != v->processor) + goto again; + } else if (v == vcpu) { vmx_vcpu_ptc_l(v, va, ps); - else + } else { ptc_ga_remote_func(&args); + if (proc != v->processor) + goto again; + } } return IA64_NO_FAULT; } -- 2.30.2